package com.zhihuishu.micro.course.service;

import java.util.List;
import java.util.Set;

import com.zhihuishu.micro.course.dto.LessonVideoDto;
import com.zhihuishu.micro.course.model.CourseVideoForBatis;
import com.zhihuishu.micro.course.model.LessonVideo;

/**
 * 
 * @author zhanglikun
 * @date 2015年10月28日 下午3:11:29
 */
public interface LessonVideoService extends IBaseService<LessonVideo> {
    /**
     * @Description:
     * @date:@2016年12月9日下午3:46:11
     * @author:嵇鹏
     * @Param:
     * @retuen:LessonVideoDto
     */
    LessonVideoDto get(Integer lessonVideoId);

    List<LessonVideoDto> list(List<Integer> lessonVideoIds);

    /**
     * 根据节ID查询小节列表
     * 
     * @param chapterId
     * @return
     */
    List<LessonVideoDto> list(int lessonId);

    /**
     * 更新小节哈希缓存
     * 
     * @param lessonVideoId
     * @return 返回从数据库中查询的小节对象
     */
    LessonVideoDto touchLessonVideo(int lessonVideoId);
    
    void touchLessonVideo(LessonVideoDto lessonVideoDto);

    /**
     * 向课程中添加小节缓存(关系)
     * 
     * @param courseId
     * @param lessonVideoId
     */
    void addLessonVideoOnCourseRedis(long courseId, int lessonVideoId);

    /**
     * 从课程程中移除小节(关系)
     * 
     * @param courseId
     * @param lessonVideoId
     */
    void removeLessonVideoOnCourseRedis(long courseId, int lessonVideoId);

    /**
     * 根据章ID列表，查询视频数
     * 
     * @param chapterIds
     * @return
     */
    int countVideos(List<Integer> chapterIds);

    /**
     * 根据课程ID集合查询小节
     * 
     * @author ztl
     * @param courseIds
     * @return
     */
    List<CourseVideoForBatis> getSmallLessonByCourseIds(List<Long> courseIds);

    /**
     * 根据节Id获取小节集合
     * 
     * @author ztl
     * @param lessonId
     * @return
     */
    List<LessonVideoDto> getLessonVideoListFromDb(Integer lessonId);

    /**
     * @Description:保存小节
     * @date:@2016年12月9日上午11:39:32
     * @author:嵇鹏
     * @return 
     * @Param:
     * @retuen:void
     */
    Integer saveLessonVideo(LessonVideoDto lessonVideoDto);

    /**
     * @Description:删除节视频在小节表中的数据
     * @date:@2016年12月9日下午1:41:35
     * @author:嵇鹏
     * @Param:
     * @retuen:void
     */
    void deleteLessonVideoInfo(Integer lessonId);

    /**
     * @Description:查询节下面小节的视频的数量
     * @date:@2016年12月9日下午1:52:51
     * @author:嵇鹏
     * @Param:
     * @retuen:int
     */
    int getLessonChildrenCount(Integer lessonId);

    /**
     * @Description:更新节
     * @date:@2016年12月9日下午4:21:58
     * @author:嵇鹏
     * @Param:
     * @retuen:void
     */
    void updateLessonVideo(LessonVideoDto lessonVideoDto);

    /**
     * @Description:删除小节
     * @date:@2016年12月9日下午4:31:23
     * @author:嵇鹏
     * @Param:
     * @retuen:void
     */
    void deleteLessonVideo(Integer lessonVideoId);
    /**
     * @Description:删除小节后 被删除小节后面的小节的排序要-1
     *  @date:@2016年12月12日上午9:26:52
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:void
     */
    void updateMinusSortByLessonIdAndSort(Long lessonId, Integer rank);
    /**
     * @Description:
     *  @date:@2016年12月12日上午10:37:45
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:void
     */
    void updateLessonVideoSort(Integer id,int targetRank);
    /**
     * @Description:更新影响小节的顺序
     *  @date:@2016年12月12日上午11:04:43
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:void
     */
    void updatePlussLessonVideoSortContaninSmall(int targetRank, int orginPos, Long lessonId);
    /**
     * @Description:查询更新小节顺序后影响到的小节
     *  @date:@2016年12月12日上午11:20:57
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:List<Integer>
     */
    
    List<Integer> queryPlusLessonVideoIdsContainSmall(int targetRank, int orginPos, Long lessonId);
    /**
     * @Description:查询更新小节顺序后影响到的小节
     *  @date:@2016年12月12日下午1:22:34
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:List<Integer>
     */
    List<Integer> queryMinusLessonVideoIdContainBig(int orginPosSmall, int targetPosBig, Long lessonId);
    /**
     * @Description:更新小节后影响到的其他小节顺序也要更新
     *  @date:@2016年12月12日下午1:30:58
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:void
     */
    void updateMinusLessonVideoSortContainBig(int orginPos, int targetPos, Long lessonId);
    /**
     * @Description:更新小节是否存在知识点的状态
     *  @date:@2016年12月12日下午5:48:05
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:void
     */
    void updateLeessonVideoKnowledgeFlag(Integer tempLessonVideId, int i);
    /**
     * @Description:根据课程查询所有的小节id
     *  @date:@2017年1月12日下午4:11:17
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:List<Integer>
     */
    Set<String> queryLessonVideoIdsByCourseId(long courseId);
    
    /**
     * @Description:根据id查询
     *  @date:@2017年3月3日上午11:27:45
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:List<Integer>
     */
    List<Integer> getIdByCourseId(long courseId);

}
